Fix set_focus_child handling during focus changes
authorAlexander Larsson <alexl@redhat.com>
Tue, 13 Dec 2011 23:23:57 +0000 (00:23 +0100)
committerAlexander Larsson <alexl@redhat.com>
Tue, 13 Dec 2011 23:26:40 +0000 (00:26 +0100)
In many cases we used to set focus_child to NULL all the way up
to the top and then to the right value, even if there was
a common ancestor, meaning these see a temporary NULL value for
focus_child. Only when the new focus widgets direct parent was
in the previous ancestor list did we stop early.

This fixes that by always stopping propagation when reaching
the common ancestor.

gtk/gtkwidget.c

index 8d772df3a697289a58304b15354580e40b9744c6..6b96be4141cd181a83d94cef35180bd85047252f 100644 (file)
@@ -6468,10 +6468,15 @@ gtk_widget_real_grab_focus (GtkWidget *focus_widget)
 
          if (widget)
            {
-             while (widget->priv->parent && widget->priv->parent != focus_widget->priv->parent)
+             GtkWidget *common_ancestor = gtk_widget_common_ancestor (widget, focus_widget);
+
+             if (widget != common_ancestor)
                {
-                 widget = widget->priv->parent;
-                 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
+                 while (widget->priv->parent && widget->priv->parent != common_ancestor)
+                   {
+                     widget = widget->priv->parent;
+                     gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
+                   }
                }
            }
        }